-- Función para actualizar hasta seis variables de precio --

CREATE OR REPLACE FUNCTION abaco_utiles.act_gral_precios_multiple(character varying, character varying, character varying, character varying, character varying, character varying, character varying, integer)
  RETURNS boolean AS
$BODY$
DECLARE   
vprecio1  		ALIAS FOR $1;
vprecio2  		ALIAS FOR $2;
vprecio3  		ALIAS FOR $3;
vprecio4  		ALIAS FOR $4;
vprecio5  		ALIAS FOR $5;
vprecio6  		ALIAS FOR $6;

vcuit   		ALIAS FOR $7;

vruta                   ALIAS FOR $8; 

vcadena 	character varying;

vservidor       character varying;

BEGIN

-- Esta funcion permite actualizar precios por articulos de hasta seis 6 variables de precios. NO CONTROLA RUBRO DE ARTICULO

-- Los seis primeros parametros corresponden a los nombres de hatsa 6 variables de precios que son las que se van a actualizar. Puede venir una cadena vacia en cualquiera 

-- de estos seis parámetros. En ese caso se ignorara y se seguirá actualizando la variable de precios que le sigue. 

-- El penultimo parametro es el cuit del cliente que es obligatorio para el caso que la base no sea local. 

-- El ultimo parametro se utiliza para indicar la ruta desde donde se leera el archivo csv con los precios:

--  1  para bases locales 

--  2  para bases en Hosting

--  3  para bases en Datacenter (fibercorp) 

-- El archivo debe venir en formato csv, delimitado por ';' y sin titulos. 

-- Los campos de la lista corresponden al codigo de articulo, y al precio de cada una de las variables, respetando el orden de los parametros

-- El archivo correspondiente a la lista se debe llamar 'precios.csv' y para las bases locales dede estar en la 

-- carpeta 'c:/abaco/gestion/listas' 

-- Los articulos estan cargados en abaco con el codigo que usa el proveedor.  

--- SOLO MODIFICA PRECIOS. NO AGREGA ARTICULOS ---

SET CLIENT_ENCODING TO LATIN1;

if vruta not in (1, 2, 3) then

   RAISE EXCEPTION 'El servidor debe corresponder a los codigis 1, 2 o 3';

end if;


CREATE TABLE abaco_utiles.renglones (  renglon character varying(1000) ) WITH ( OIDS=TRUE );

-- La lista viene en formato csv, delimitado por ';' y sin titulos. 

if vruta = 1 then

   copy abaco_utiles.renglones from 'c:/abaco/gestion/listas/precios.csv';

  else

    if vruta = 2 then

       vservidor:= '/var/www/html/implementacion_datos/clientes/'; -- Hosting

     else

       vservidor:= '/datacenter/var/www/html/implementacion_datos/clientes/'; -- Datacenter (fibercorp)

    end if;

    vcadena:= 'copy abaco_utiles.renglones from ''' || vservidor || vcuit || '/' || 'precios.csv' || '''';

    EXECUTE vcadena; 

end if;

-- Elimino las lineas que no tienen codigo --

DELETE FROM abaco_utiles.renglones renglones where trim(split_part(renglon, ';', 1)) = ''; 


CREATE TABLE abaco_utiles.lista

(

  idart integer, 

  codigo character varying(30),

  precio1 numeric(16,2), 

  precio2 numeric(16,2), 

  precio3 numeric(16,2), 

  precio4 numeric(16,2), 

  precio5 numeric(16,2), 

  precio6 numeric(16,2), 

  es_nuevo character

)

WITH (OIDS=TRUE);

ALTER TABLE abaco_utiles.lista OWNER TO abacouser;


CREATE TABLE abaco_utiles.repetidos

(

  codigo	character varying(50),

  ocurrencias   integer

)

WITH (OIDS=TRUE);

INSERT INTO abaco_utiles.lista(codigo, precio1, precio2, precio3, precio4, precio5, precio6, es_nuevo)

SELECT trim(split_part(renglon, ';', 1)) as codigo, 

       str_a_nro(trim(split_part(renglon, ';', 2))) as precio1, 

       str_a_nro(trim(split_part(renglon, ';', 3))) as precio2, 

       str_a_nro(trim(split_part(renglon, ';', 4))) as precio3, 

       str_a_nro(trim(split_part(renglon, ';', 5))) as precio4, 

       str_a_nro(trim(split_part(renglon, ';', 6))) as precio5, 

       str_a_nro(trim(split_part(renglon, ';', 7))) as precio6, 

       'S' as es_nuevo 

FROM abaco_utiles.renglones

ORDER BY oid;

-- Se borran los articulos repetidos para que lueego no de error el insert en la tabla prexart

insert into abaco_utiles.repetidos (codigo, ocurrencias)

select codigo, count(*) from abaco_utiles.lista

group by codigo

having count(*) > 1;

delete from abaco_utiles.lista where codigo in (select codigo from abaco_utiles.repetidos);

-- Eliminamos los blancos de las puntas....

update abaco_utiles.lista set codigo = trim(codigo) where codigo <> trim(codigo);

-- Obtengo el idart para los que estan en abaco.   

UPDATE abaco_utiles.lista SET idart = art.id, es_nuevo = 'N'

FROM art

WHERE art.cod = lista.codigo;      

--vprecio1

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio1

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio1 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio1)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio1), abaco_utiles.lista.idart, abaco_utiles.lista.precio1

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio1 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio1))

ORDER BY abaco_utiles.lista.idart;

--vprecio2

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio2

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio2 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio2)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio2), abaco_utiles.lista.idart, abaco_utiles.lista.precio2

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio2 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio2))

ORDER BY abaco_utiles.lista.idart;

--vprecio3

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio3

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio3 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio3)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio3), abaco_utiles.lista.idart, abaco_utiles.lista.precio3

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio3 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio3))

ORDER BY abaco_utiles.lista.idart;

--vprecio4

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio4

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio4 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio4)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio4), abaco_utiles.lista.idart, abaco_utiles.lista.precio4

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio4 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio4))

ORDER BY abaco_utiles.lista.idart;

--vprecio5

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio5

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio5 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio5)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio5), abaco_utiles.lista.idart, abaco_utiles.lista.precio5

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio5 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio5))

ORDER BY abaco_utiles.lista.idart;

--vprecio6

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio6

FROM abaco_utiles.lista

WHERE (cast(abaco_utiles.lista.precio6 as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))

      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio6)

	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)

SELECT (select id from pre where cod = vprecio6), abaco_utiles.lista.idart, abaco_utiles.lista.precio6

FROM abaco_utiles.lista 

WHERE abaco_utiles.lista.precio6 > 0 and abaco_utiles.lista.es_nuevo = 'N'  

      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio6))

ORDER BY abaco_utiles.lista.idart;

RETURN true;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
  
ALTER FUNCTION abaco_utiles.act_gral_precios_multiple(character varying, character varying, character varying, character varying, character varying, character varying, character varying, integer)
  OWNER TO abacouser;

--
SELECT aaVersion('517.04','517.03');
--	
	
	


